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.metis.data.MetisDataDifference;
20 import io.github.tonywasher.joceanus.metis.field.MetisFieldRequired;
21 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseAssetDirection;
22 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseAssetType;
23 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseBasicDataType;
24 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseBasicResource;
25 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseDataValidator.MoneyWiseDataValidatorTrans;
26 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseDeposit;
27 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseLoan;
28 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWisePayee;
29 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWisePortfolio;
30 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseSecurity;
31 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseSecurityHolding;
32 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseTransAsset;
33 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseTransBase;
34 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseTransCategory;
35 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseTransInfoSet;
36 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseTransaction;
37 import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWiseDepositCategoryClass;
38 import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWisePayeeClass;
39 import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWisePortfolioClass;
40 import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWiseSecurityClass;
41 import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWiseTransCategoryClass;
42 import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWiseTransInfoClass;
43 import io.github.tonywasher.joceanus.oceanus.base.OceanusException;
44 import io.github.tonywasher.joceanus.oceanus.date.OceanusDate;
45 import io.github.tonywasher.joceanus.oceanus.date.OceanusDateRange;
46 import io.github.tonywasher.joceanus.oceanus.decimal.OceanusMoney;
47 import io.github.tonywasher.joceanus.oceanus.decimal.OceanusUnits;
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 return switch (myCatClass) {
298 case TAXEDINCOME, GROSSINCOME, RECOVEREDEXPENSES, OTHERINCOME ->
299
300 myType.isValued();
301 case PENSIONCONTRIB ->
302
303 (pAccount instanceof MoneyWiseSecurityHolding myHolding
304 && myHolding.getSecurity().getCategoryClass().isPension())
305 || (pAccount instanceof MoneyWisePortfolio myPortfolio
306 && myPortfolio.isPortfolioClass(MoneyWisePortfolioClass.SIPP));
307 case GIFTEDINCOME, INHERITED ->
308
309 myType.isAsset();
310 case INTEREST ->
311
312 myType.isDeposit() || myType.isPortfolio();
313 case DIVIDEND, SECURITYCLOSURE ->
314
315 myType.isSecurityHolding();
316 case BADDEBTCAPITAL, BADDEBTINTEREST ->
317
318 pAccount instanceof MoneyWiseDeposit myDeposit
319 && myDeposit.isDepositClass(MoneyWiseDepositCategoryClass.PEER2PEER);
320 case CASHBACK -> checkCashBack(pAccount);
321 case LOYALTYBONUS -> checkLoyaltyBonus(pAccount);
322 case RENTALINCOME, RENTALEXPENSE, ROOMRENTALINCOME ->
323
324 pAccount instanceof MoneyWiseSecurityHolding myHolding
325 && myHolding.getSecurity().isSecurityClass(MoneyWiseSecurityClass.PROPERTY);
326 case UNITSADJUST, SECURITYREPLACE ->
327
328 pAccount.isCapital();
329 case STOCKSPLIT, STOCKTAKEOVER, STOCKDEMERGER, STOCKRIGHTSISSUE ->
330
331 pAccount.isShares();
332 case WRITEOFF, LOANINTERESTEARNED, LOANINTERESTCHARGED, TAXRELIEF -> myType.isLoan();
333 case LOCALTAXES, INCOMETAX -> myType.isValued();
334 case EXPENSE -> myType.isValued() || myType.isAutoExpense();
335 case PORTFOLIOXFER -> pAccount instanceof MoneyWiseSecurityHolding
336 || pAccount instanceof MoneyWisePortfolio;
337 case TRANSFER -> true;
338
339
340 default -> false;
341 };
342 }
343
344 @Override
345 public boolean isValidDirection(final MoneyWiseTransAsset pAccount,
346 final MoneyWiseTransCategory pCategory,
347 final MoneyWiseAssetDirection pDirection) {
348
349
350
351 final MoneyWiseTransCategoryClass myCatClass = pCategory.getCategoryTypeClass();
352
353
354 return switch (myCatClass) {
355 case TAXEDINCOME, GROSSINCOME ->
356
357 newValidation || pDirection.isFrom();
358 case PENSIONCONTRIB ->
359
360 pDirection.isFrom();
361 case GIFTEDINCOME, INHERITED ->
362
363 newValidation || pDirection.isFrom();
364 case RENTALINCOME, ROOMRENTALINCOME ->
365
366 pDirection.isTo();
367 case RENTALEXPENSE ->
368
369 pDirection.isFrom();
370 case INTEREST ->
371
372 newValidation || pDirection.isTo();
373 case DIVIDEND, SECURITYCLOSURE ->
374
375 pDirection.isTo();
376 case LOYALTYBONUS ->
377
378 newValidation || pDirection.isTo();
379 case WRITEOFF, LOANINTERESTCHARGED ->
380
381 newValidation || pDirection.isTo();
382 case LOANINTERESTEARNED ->
383
384 newValidation || pDirection.isFrom();
385 case UNITSADJUST, STOCKSPLIT, STOCKDEMERGER, STOCKTAKEOVER, SECURITYREPLACE, PORTFOLIOXFER ->
386
387 pDirection.isTo();
388 case null, default -> true;
389 };
390 }
391
392 @Override
393 public boolean isValidPartner(final MoneyWiseTransAsset pAccount,
394 final MoneyWiseTransCategory pCategory,
395 final MoneyWiseTransAsset pPartner) {
396
397 final boolean isRecursive = MetisDataDifference.isEqual(pAccount, pPartner);
398 final MoneyWiseAssetType myPartnerType = pPartner.getAssetType();
399 final MoneyWiseTransCategoryClass myCatClass = Objects.requireNonNull(pCategory.getCategoryTypeClass());
400
401
402 if (pPartner.isHidden()) {
403 return false;
404 }
405
406
407 if (pPartner instanceof MoneyWiseSecurityHolding myHolding
408 && !checkSecurityHolding(myHolding)) {
409 return false;
410 }
411
412
413 if (pPartner instanceof MoneyWisePortfolio myPortfolio
414 && myPortfolio.getCategoryClass().holdsPensions()) {
415 return false;
416 }
417
418
419 if (pAccount.isAutoExpense()
420 || pPartner.isAutoExpense()) {
421
422 final MoneyWiseAssetType myAccountType = pAccount.getAssetType();
423
424
425 return switch (myCatClass) {
426 case TRANSFER ->
427
428 myPartnerType.isAutoExpense()
429 ? myAccountType.isValued()
430 : myPartnerType.isValued();
431 case EXPENSE ->
432
433 pPartner instanceof MoneyWisePayee;
434
435
436 default -> false;
437 };
438 }
439
440
441 return switch (myCatClass) {
442 case TAXEDINCOME, GROSSINCOME ->
443
444 pPartner instanceof MoneyWisePayee myPayee
445 && myPayee.getCategoryClass().canProvideTaxedIncome();
446 case PENSIONCONTRIB ->
447
448 pPartner instanceof MoneyWisePayee myPayee
449 && myPayee.getCategoryClass().canContribPension();
450 case OTHERINCOME, RECOVEREDEXPENSES ->
451
452 pPartner instanceof MoneyWisePayee;
453 case LOCALTAXES ->
454
455 pPartner instanceof MoneyWisePayee myPayee
456 && myPayee.isPayeeClass(MoneyWisePayeeClass.GOVERNMENT);
457 case GIFTEDINCOME, INHERITED ->
458
459 pPartner instanceof MoneyWisePayee myPayee
460 && myPayee.isPayeeClass(MoneyWisePayeeClass.INDIVIDUAL);
461 case RENTALINCOME, RENTALEXPENSE, ROOMRENTALINCOME ->
462
463 myPartnerType.isLoan();
464 case WRITEOFF, LOANINTERESTEARNED, LOANINTERESTCHARGED ->
465
466 isRecursive;
467 case INTEREST, CASHBACK ->
468
469 myPartnerType.isValued();
470 case DIVIDEND -> checkDividend(pAccount, pPartner);
471 case LOYALTYBONUS -> checkLoyaltyBonus(pAccount, pPartner);
472 case BADDEBTCAPITAL, BADDEBTINTEREST -> pPartner instanceof MoneyWisePayee
473 && MetisDataDifference.isEqual(pPartner, pAccount.getParent());
474 case UNITSADJUST, STOCKSPLIT ->
475
476 isRecursive;
477 case SECURITYREPLACE, STOCKTAKEOVER, STOCKDEMERGER -> checkTakeOver(pAccount, pPartner);
478 case STOCKRIGHTSISSUE -> checkStockRights(pAccount, pPartner);
479 case TRANSFER -> checkTransfer(pAccount, pPartner);
480 case SECURITYCLOSURE -> checkSecurityClosure(pAccount, pPartner);
481 case EXPENSE ->
482
483 pPartner instanceof MoneyWisePayee;
484 case INCOMETAX, TAXRELIEF -> pPartner instanceof MoneyWisePayee myPayee
485 && myPayee.isPayeeClass(MoneyWisePayeeClass.TAXMAN);
486 case PORTFOLIOXFER -> checkPortfolioXfer(pAccount, pPartner);
487 default -> false;
488 };
489 }
490
491
492
493
494
495
496
497 private static boolean checkSecurityHolding(final MoneyWiseSecurityHolding pHolding) {
498
499 final MoneyWisePortfolio myPortfolio = pHolding.getPortfolio();
500 final MoneyWiseSecurity mySecurity = pHolding.getSecurity();
501
502
503 if (myPortfolio.getCategoryClass().holdsPensions()) {
504
505 return mySecurity.getCategoryClass().isPension();
506 }
507
508
509 return !mySecurity.getCategoryClass().isPension();
510 }
511
512
513
514
515
516
517
518
519 private static boolean checkDividend(final MoneyWiseTransAsset pAccount,
520 final MoneyWiseTransAsset pPartner) {
521
522 if (MetisDataDifference.isEqual(pAccount, pPartner)) {
523 return true;
524 }
525
526
527 return pPartner.getAssetType().isValued();
528 }
529
530
531
532
533
534
535
536
537 private static boolean checkTakeOver(final MoneyWiseTransAsset pAccount,
538 final MoneyWiseTransAsset pPartner) {
539
540 if (!(pAccount instanceof MoneyWiseSecurityHolding myAccount)
541 || !(pPartner instanceof MoneyWiseSecurityHolding myPartner)) {
542 return false;
543 }
544
545
546 if (MetisDataDifference.isEqual(pAccount, pPartner)) {
547 return false;
548 }
549
550
551 if (!MetisDataDifference.isEqual(myAccount.getPortfolio(), myPartner.getPortfolio())) {
552 return false;
553 }
554
555
556 return MetisDataDifference.isEqual(myAccount.getSecurity().getCategory(), myPartner.getSecurity().getCategory());
557 }
558
559
560
561
562
563
564
565
566 private static boolean checkStockRights(final MoneyWiseTransAsset pAccount,
567 final MoneyWiseTransAsset pPartner) {
568
569 if (pAccount instanceof MoneyWiseSecurityHolding myHolding
570 && pPartner instanceof MoneyWisePortfolio) {
571
572 return MetisDataDifference.isEqual(myHolding.getPortfolio(), pPartner);
573 }
574
575
576 return pPartner.getAssetType().isValued();
577 }
578
579
580
581
582
583
584
585 private static boolean checkCashBack(final MoneyWiseTransAsset pAccount) {
586
587 if (pAccount instanceof MoneyWiseDeposit myDeposit) {
588 return myDeposit.getCategoryClass().canCashBack();
589 }
590
591
592 if (pAccount instanceof MoneyWiseLoan myLoan) {
593 return myLoan.getCategoryClass().canCashBack();
594 }
595
596
597 return false;
598 }
599
600
601
602
603
604
605
606 private boolean checkLoyaltyBonus(final MoneyWiseTransAsset pAccount) {
607
608 if (pAccount instanceof MoneyWiseDeposit myDeposit) {
609 return newValidation
610 || myDeposit.getCategoryClass().canLoyaltyBonus();
611 }
612
613
614 return pAccount instanceof MoneyWisePortfolio;
615 }
616
617
618
619
620
621
622
623
624 private static boolean checkLoyaltyBonus(final MoneyWiseTransAsset pAccount,
625 final MoneyWiseTransAsset pPartner) {
626
627 if (pAccount instanceof MoneyWisePortfolio
628 && pPartner instanceof MoneyWiseSecurityHolding myHolding) {
629
630 return MetisDataDifference.isEqual(myHolding.getPortfolio(), pAccount);
631 }
632
633
634 return MetisDataDifference.isEqual(pAccount, pPartner);
635 }
636
637
638
639
640
641
642
643
644 private static boolean checkTransfer(final MoneyWiseTransAsset pAccount,
645 final MoneyWiseTransAsset pPartner) {
646
647 if (MetisDataDifference.isEqual(pAccount, pPartner)) {
648 return false;
649 }
650
651
652 if (pAccount instanceof MoneyWiseSecurityHolding myHolding
653 && pPartner instanceof MoneyWisePortfolio) {
654
655 if (!MetisDataDifference.isEqual(myHolding.getPortfolio(), pPartner)) {
656 return false;
657 }
658 }
659
660
661 if (pPartner instanceof MoneyWiseSecurityHolding myHolding
662 && pAccount instanceof MoneyWisePortfolio) {
663
664 if (!MetisDataDifference.isEqual(myHolding.getPortfolio(), pAccount)) {
665 return false;
666 }
667 }
668
669
670 return pPartner.getAssetType().isAsset();
671 }
672
673
674
675
676
677
678
679
680 private static boolean checkSecurityClosure(final MoneyWiseTransAsset pAccount,
681 final MoneyWiseTransAsset pPartner) {
682
683 if (MetisDataDifference.isEqual(pAccount, pPartner)) {
684 return false;
685 }
686
687
688 return pPartner.getAssetType().isValued();
689 }
690
691
692
693
694
695
696
697
698 private static boolean checkPortfolioXfer(final MoneyWiseTransAsset pAccount,
699 final MoneyWiseTransAsset pPartner) {
700
701 if (!(pPartner instanceof MoneyWisePortfolio)) {
702 return false;
703 }
704
705
706 if (pAccount instanceof MoneyWisePortfolio) {
707
708 if (MetisDataDifference.isEqual(pAccount, pPartner)) {
709 return false;
710 }
711
712
713 return MetisDataDifference.isEqual(pAccount.getAssetCurrency(), pPartner.getAssetCurrency());
714 }
715
716
717 if (pAccount instanceof MoneyWiseSecurityHolding myHolding) {
718
719 return !MetisDataDifference.isEqual(myHolding.getPortfolio(), pPartner);
720 }
721
722
723 return false;
724 }
725
726
727
728
729
730
731
732
733 public MetisFieldRequired isClassRequired(final MoneyWiseTransaction pTrans,
734 final MoneyWiseTransInfoClass pClass) {
735 theInfoSet.storeInfoSet(pTrans.getInfoSet());
736 return theInfoSet.isClassRequired(pClass);
737 }
738
739 @Override
740 public void autoCorrect(final MoneyWiseTransaction pItem) throws OceanusException {
741 theDefaults.autoCorrect(pItem);
742 }
743
744 @Override
745 public MoneyWiseTransaction buildTransaction(final Object pKey) {
746 return theDefaults.buildTransaction(pKey);
747 }
748
749 @Override
750 public void setRange(final OceanusDateRange pRange) {
751 theDefaults.setRange(pRange);
752 }
753
754 @Override
755 public OceanusDateRange getRange() {
756 return theDefaults.getRange();
757 }
758 }